package leetcode.editor.cn.dp;

//给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是回文。 
//
// 返回符合要求的 最少分割次数 。 
//
// 
// 
// 
//
// 示例 1： 
//
// 
//输入：s = "aab"
//输出：1
//解释：只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
// 
//
// 示例 2： 
//
// 
//输入：s = "a"
//输出：0
// 
//
// 示例 3： 
//
// 
//输入：s = "ab"
//输出：1
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 2000 
// s 仅由小写英文字母组成 
// 
// 
// 
// Related Topics 动态规划 
// 👍 419 👎 0

class PalindromePartitioningIi {
    public static void main(String[] args) {
        Solution solution = new PalindromePartitioningIi().new Solution();

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int minCut(String s) {
            boolean[][] isPalindrome = new boolean[s.length()][s.length()];
            for (int i = s.length() - 1; i >= 0; i--) {
                for (int j = 0; j < isPalindrome[0].length; j++) {
                    if (i >= j) {
                        isPalindrome[i][j] = true;
                        continue;
                    }
                    isPalindrome[i][j] = isPalindrome[i + 1][j - 1] && s.charAt(i) == s.charAt(j);
                }
            }
            int[] dp = new int[s.length()];
            for (int i = 0; i < dp.length; i++) {
                int min = Integer.MAX_VALUE;
                if (isPalindrome[0][i])
                    dp[i] = 0;
                else {
                    for (int j = 0; j < i; j++) {
                        if (isPalindrome[j + 1][i]) {
                            min = Math.min(dp[j], min);
                        }
                    }
                    dp[i] = min + 1;
                }
            }
            return dp[dp.length-1];
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
